CREATE PROCEDURE SP_CARGA_STAGING_DIM_FUNCIONARIO(
	@DATA DATETIME
)
AS
BEGIN
	DECLARE @DATA_CARGA DATETIME,
			@cdFuncionario INT,
			@Nome VARCHAR(80),
			@CPF VARCHAR(12),
			@Sexo CHAR(1),
			@DataNascimento DATETIME,
			@EstadoCivil VARCHAR(30),
			@Telefone VARCHAR(13),
			@Email VARCHAR(100),
			@Rua VARCHAR(45),
			@Numero VARCHAR(10),
			@Bairro VARCHAR(45),
			@CEP VARCHAR(10),
			@Cidade VARCHAR(45),
			@Estado VARCHAR(45),
			@Cargo VARCHAR(45),
			@Salario DECIMAL(11,2),

			@IdFuncionario_df INT,
			@cdFuncionario_df INT,
			@Nome_df VARCHAR(80),
			@CPF_df VARCHAR(12),
			@Sexo_df CHAR(1),
			@DataNascimento_df DATETIME,
			@EstadoCivil_df VARCHAR(30),
			@Telefone_df VARCHAR(13),
			@Email_df VARCHAR(100),
			@Rua_df VARCHAR(45),
			@Numero_df VARCHAR(10),
			@Bairro_df VARCHAR(45),
			@CEP_DF VARCHAR(10),
			@Cidade_df VARCHAR(45),
			@Estado_df VARCHAR(45),
			@Cargo_df VARCHAR(45),
			@Salario_df DECIMAL(11,2),
			@Dt_Inicio_df DATETIME,
			@Dt_Fim_df DATETIME,
					
			@PROCESS INT
						
	DECLARE C_FUNCIONARIO CURSOR FOR 
		SELECT f.DataCarga, f.cdFuncionario, f.Nome, f.CPF, f.Sexo, f.DataNascimento, f.EstadoCivil, f.Telefone, f.Email, f.Rua, f.Numero, f.Bairro, f.CEP, f.Cidade, f.Estado, f.Cargo, f.Salario
		FROM FuncionarioAux AS f
		WHERE f.DataCarga = @DATA
	OPEN C_FUNCIONARIO
	FETCH NEXT FROM C_FUNCIONARIO INTO @DATA_CARGA, @cdFuncionario, @Nome, @CPF, @sexo, @DataNascimento, @EstadoCivil, @Telefone, @Email, @Rua, @Numero, @Bairro, @CEP, @Cidade, @Estado, @Cargo, @Salario
	WHILE(@@FETCH_STATUS = 0)
	BEGIN
		SELECT @IdFuncionario_df = df.idFuncionario, @cdFuncionario_df = df.cdFuncionario, @Nome_df = df.Nome, @CPF_df = df.CPF,
			   @Sexo_df = df.Sexo, @DataNascimento_df = df.DataNascimento, @EstadoCivil_df = df.EstadoCivil, @Telefone_df = df.Telefone,
			   @Email_df = df.Email, @Rua_df = df.Rua, @Numero_df = df.Numero, @Bairro_df = df.Bairro, @CEP_df = df.CEP, @Cidade_df = df.Cidade, 
			   @Estado_df = df.Estado, @Cargo_df = df.Cargo, @Salario_df = df.Salario, @Dt_Inicio_df = df.dt_inicio
		FROM DimFuncionario AS df
		WHERE (df.cdFuncionario = @cdFuncionario) AND (df.dt_fim IS NULL)
		
		IF (@Dt_Inicio_df IS NULL)
		BEGIN
			SET @DT_INICIO_DF = '19000101'
		END
		IF (@DT_INICIO_DF <> @DATA_CARGA OR @DT_INICIO_DF >= @DATA_CARGA )
		BEGIN
			SET @PROCESS = ISNULL(@IdFuncionario_df,0)
			IF (@PROCESS <> 0)
			BEGIN
				If (@Cargo <> @Cargo_df AND (NOT (@Cargo IS NULL)))
				BEGIN
					UPDATE DimFuncionario
					SET DT_FIM = @DATA_CARGA, FL_CORRENTE = 'NAO'
					WHERE cdFuncionario = @cdFuncionario
					
					INSERT INTO DimFuncionario (cdFuncionario, Nome, CPF, Sexo, DataNascimento, EstadoCivil, Telefone, Email, Rua, Numero, Bairro, CEP, Cidade, Estado, Cargo, Salario, DT_INICIO, DT_FIM, FL_CORRENTE)
					VALUES (@cdFuncionario, @Nome, @CPF, @Sexo, @DataNascimento, @EstadoCivil, @Telefone, @Email, @Rua, @Numero, @Bairro, @CEP, @Cidade, @Estado, @Cargo, @Salario, @DATA_CARGA, NULL, 'SIM');
				END
					
				UPDATE DimFuncionario
				SET NOME = @NOME, CPF = @CPF, Sexo = @Sexo,DataNascimento = @DataNascimento, EstadoCivil = @EstadoCivil, 
				Telefone = @Telefone, Email = @Email, Rua = @Rua, Numero = @Numero, Bairro = @Bairro, cep = @CEP, Cidade = @Cidade,
				Estado = @Estado, Salario = @Salario  
				WHERE cdFuncionario = @cdFuncionario
			END	
			ELSE
			BEGIN
				IF ((NOT (@NOME IS NULL OR @CPF IS NULL)) AND (NOT (@Cargo IS NULL OR @Sexo IS NULL OR @DataNascimento IS NULL OR @EstadoCivil IS NULL OR 
				   @Telefone IS NULL OR @Email IS NULL OR @Rua IS NULL OR @Numero IS NULL OR @Bairro IS NULL OR 
				   @Cidade IS NULL OR @Estado IS NULL OR @Cargo IS NULL OR @Salario IS NULL)))
				BEGIN
				INSERT INTO DimFuncionario (cdFuncionario, Nome, CPF, Sexo, DataNascimento, EstadoCivil, Telefone, Email, Rua, Numero, Bairro, CEP, Cidade, Estado, Cargo, Salario, DT_INICIO, DT_FIM, FL_CORRENTE)
						VALUES (@cdFuncionario, @Nome, @CPF, @Sexo, @DataNascimento, @EstadoCivil, @Telefone, @Email, @Rua, @Numero, @Bairro, @CEP, @Cidade, @Estado, @Cargo, @Salario, @DATA_CARGA, NULL, 'SIM');
				END
			END	
		END
		FETCH NEXT FROM C_FUNCIONARIO INTO @DATA_CARGA, @cdFuncionario, @Nome, @CPF, @sexo, @DataNascimento, @EstadoCivil, @Telefone, @Email, @Rua, @Numero, @Bairro, @cep, @Cidade, @Estado, @Cargo, @Salario
	END
	CLOSE C_FUNCIONARIO
	DEALLOCATE C_FUNCIONARIO
END;
GO

SET DATEFORMAT DMY
EXEC SP_CARGA_STAGING_DIM_FUNCIONARIO '16/07/2012'

SELECT * FROM DimFuncionario